package com.jackykeke.opengldemo.renderer;

import android.opengl.GLES20;
import android.opengl.GLES30;
import android.opengl.GLSurfaceView;

import com.jackykeke.opengldemo.R;
import com.jackykeke.opengldemo.utils.ResReadUtil;
import com.jackykeke.opengldemo.utils.ShaderUtil;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

public class RectangleRenderer implements GLSurfaceView.Renderer {

    private FloatBuffer vertexBuffer;

    //定义顶点着色器：  rectangle_vertex_shader.glsl
//    定义片段着色器： rectangle_fragment_shader.glsl


//    定义坐标点数据：

    private float[] vertexPoints = new float[]{
            //前两个是坐标,后三个是颜色RGB
            0.0f, 0.0f, 1.0f, 1.0f, 1.0f,   //白色
            -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
            0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
            0.5f, 0.5f, 1.0f, 1.0f, 1.0f,
            -0.5f, 0.5f, 1.0f, 1.0f, 1.0f,
            -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
            0.0f, 0.25f, 1f, 0f, 0.5f,   //玫红色
            0.0f, -0.25f, 0f, 0f, 1f,   //蓝色
//            0.0f, 0.25f, 1.0f, 1.0f, 1.0f,
//            0.0f, -0.25f, 1.0f, 1.0f, 1.0f,
    };


    public RectangleRenderer() {
        //分配内存空间,每个浮点型占4字节空间
        vertexBuffer = ByteBuffer.allocateDirect(vertexPoints.length * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        //传入指定的坐标数据
        vertexBuffer.put(vertexPoints);
        vertexBuffer.position(0);
    }


    private int aPositionLocation;
    private int aColorLocation;
    private static int POSITION_COMPONENT_COUNT = 2;
    private static int COLOR_COMPONENT_COUNT = 3;
    private static final int BYTES_PER_FLOAT = 4;

    //之前定义的坐标数据中，每一行是5个数据，前两个表示坐标(x,y)，后三个表示颜色(r,g,b)
    private static final int STRIDE = (POSITION_COMPONENT_COUNT + COLOR_COMPONENT_COUNT) * BYTES_PER_FLOAT;
    //所以这里实际是 STRIDE = (2 + 3) x 4


    //开始编译和链接着色器：
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //设置/改变背景颜色
        GLES30.glClearColor(1f, 0f, 0.5f, 0.5f);

        //编译
        int vertexShaderId = ShaderUtil.compileVertexShader(ResReadUtil.readResource(R.raw.rectangle_vertex_shader));
        int fragmentShaderId = ShaderUtil.compileFragmentShader(ResReadUtil.readResource(R.raw.rectangle_fragment_shader));

        //连接程序片段
        int mProgram = ShaderUtil.linkProgram(vertexShaderId, fragmentShaderId);
        GLES30.glUseProgram(mProgram);

        aPositionLocation = GLES30.glGetAttribLocation(mProgram, "vPosition");
        aColorLocation = GLES30.glGetAttribLocation(mProgram, "aColor");

        //调整偏移位置 读取顶点位置
        vertexBuffer.position(0);
        //获取顶点数组 (POSITION_COMPONENT_COUNT = 2)
        GLES30.glVertexAttribPointer(aPositionLocation, POSITION_COMPONENT_COUNT, GLES30.GL_FLOAT, false, STRIDE, vertexBuffer);
        //注意：glVertexAttribPointer这个方法的第5个参数，stride，这个参数表示：
        //
        //每个顶点由size指定的顶点属性分量顺序存储。stride指定顶 点索引I和(I+1），表示的顶点数据之间的位移。如果stride为0，则每个顶点的属性数据顺序存储。如果stride大于0, 则使用该值作为获取下一个索引表示的顶点数据的跨距。
        //启用顶点属性
        GLES30.glEnableVertexAttribArray(aPositionLocation);


        // //调整偏移位置 读取顶点颜色
        vertexBuffer.position(POSITION_COMPONENT_COUNT);
        //颜色属性分量的数量 COLOR_COMPONENT_COUNT = 3
        GLES30.glVertexAttribPointer(aColorLocation, COLOR_COMPONENT_COUNT, GLES30.GL_FLOAT, false, STRIDE, vertexBuffer);
        GLES30.glEnableVertexAttribArray(aColorLocation);

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES30.glViewport(0, 0, width, height);
    }


    //开始绘制：
    @Override
    public void onDrawFrame(GL10 gl) {

        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);

        //绘制矩形 及梯形
        GLES30.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 8);
        //绘制两个点
        GLES30.glDrawArrays(GLES20.GL_POINTS, 6, 2);

    }
}
